跳到主要内容

定时MQTT控制

提示

计划的 MQTT 控制用于提前发送计划消息。有关实时控制,请参见 实时 MQTT 控制

本指南将帮助您在您的 DemoBrandName ControllerDemoName 上配置 MQTT,以远程控制和监控电池和太阳能电池板的安装。

需要的内容

  1. 具备互联网连接的 DemoBrandName ControllerDemoName
  2. MQTT 凭证:可以通过发送电子邮件至 support@eniris.be 请求。
  3. Python 开发环境(或任何其他 MQTT 客户端)。本指南使用用 Python 编写的基本示例来帮助您入门 MQTT 和发送命令。我们推荐使用 Python,因为它易于使用,但任何其他 MQTT 客户端也是支持的。

额外信息

MQTT 是一种快速的互联网通信协议。它是一个发布/订阅消息系统,允许您的设备与 DemoBrandName ControllerDemoName 之间建立直接连接。您的资产被分类为太阳能、电池、电动车和暖通空调组。目前,此集成允许按组进行控制,而不是按设备进行控制。

首次配置(新用户的起始点)

我想为 MQTT 远程控制设置一个 DemoBrandName ControllerDemoName

1. 检查您的网络

确保您的网络允许通过 1883 端口的 mqtt 网络流量。您可以使用以下命令进行检查:

nc -zv mqtt.eniris.be 1883

如果此命令不可用,您也可以下载并执行 这段 python 代码

如有疑问,请咨询您的网络工程师,或者在连接错误发生时临时使用您手机的 4G/5G 热点。

备注

当 1883 端口在您的网络中不可访问时,我们提供 80 端口作为备用。可以在本手册的后续步骤中在您的 MQTT客户端中进行配置。

2. 添加您的设备

登录到调试接口 并确保 设备已添加DemoBrandName ControllerDemoName

3. 添加 MQTT 外部信号

Image 1
Image 1
Image 1

4. 启用 MQTT 远程信号

选择您希望包含在 MQTT 远程控制中的所有设备。

Image 1

5. 远程信号已添加

现在在 DemoBrandName ControllerDemoName 上激活了 MQTT 远程控制接口。

我们现在准备使用一个简单的示例发送一些基本命令。状态列告诉您任何命令是否处于活动状态。

Python 演示脚本

一个良好的起点是用一个简单的示例测试您新设置的集成。

这段测试代码持续发送以下计划:

  • 电池:以 5 kW 的功率充电 15 分钟后暂停 10 分钟
  • 太阳能:在 30 分钟内将功率设置为 0 kW 维持 1 小时

DemoBrandName ControllerDemoName 将以包含唯一计划标识符的确认消息做出响应,或者发送错误消息。

然后我们为两种设备类型获取下一个计划,以确认命令成功。

请在您首选的 Python IDE 中下载以下文件。填写您的序列号和 MQTT 凭证,然后执行脚本:

当上述操作成功后,您可以继续发送其他类型的消息。所有消息的描述如下。

发送命令的 MQTT 文档

本节详细说明了设置 DemoBrandName ControllerDemoName 网络中设备的计划控制所需的 MQTT 消息格式和负载要求。

MQTT 主题

  • 订阅主题:standard1/rp_one_s/remoteScheduleMetrics/<controller SN>
  • 反馈主题:standard1/outbound/remoteScheduleMetrics/feedback/<controller SN>

其中 <controller SN> 应替换为您要控制的 DemoBrandName ControllerDemoName 的实际序列号。

MQTT 消息类型

1. 设置计划(set_schedule

为设备类型创建一个新计划。

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "set_schedule",
"fields": {
"device_type": "<Device Type>",
"node_id": "<Node ID>" (可选),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Policy>",
"power_setpoint_w": <Setpoint in watts>,
"site_import": <Site Import in Watts>,
"site_export": <Site Export in Watts>,
"remove_overlap": <True/False> (可选) (默认=False),
"tag": <Tag String> (可选) (默认=None)
}
}

响应(成功):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "set_schedule_ack",
"state": {
"schedule_id": <Schedule ID>,
"deleted_ids": <Schedulde IDs deleted if remove_overlap=True>,
"tag": <Tag String> (默认=None)
},
"responseCode": 0
}
}

2. 设置多个计划(set_schedules

创建多个新计划。

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "set_schedules",
"fields":
"0": '{
"device_type": "<Device Type>",
"node_id": "<Node ID>" (可选),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Policy>",
"power_setpoint_w": <Setpoint in watts>,
"site_import": <Site Import in Watts>,
"site_export": <Site Export in Watts>,
"remove_overlap": <True/False> (可选) (默认=False)
}',
"1": '{
"device_type": "<Device Type>",
"node_id": "<Node ID>" (可选),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Policy>",
"power_setpoint_w": <Setpoint in watts>,
"site_import": <Site Import in Watts>,
"site_export": <Site Export in Watts>,
"remove_overlap": <True/False> (可选) (默认=False)
}',
...
}

响应(成功):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "set_schedules_ack",
"state": {
"schedule_ids": <Schedule IDs>,
"deleted_ids": <Schedulde IDs deleted if remove_overlap=True>
},
"responseCode": 0
}
}

3. 获取计划(get_schedule

按 ID 检索特定计划。

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_schedule",
"fields": {
"id": <Schedule ID>
}
}

响应:

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_schedule_ack",
"state": <Schedule>,
"responseCode": 0
}
}

4. 获取活动日程 (get_active_schedule)

检索设备类型当前活动的日程。

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_active_schedule",
"fields": {
"device_type": "<Device Type>",
"node_id": "<Node ID>" (可选),
}
}

响应(成功):
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_active_schedule_ack",
"state": <Schedule>,
"responseCode": 0
}
}

#### 5. 获取下一个日程 (`get_next_schedule`)
检索设备类型的下一个即将到来的日程。

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_next_schedule",
"fields": {
"device_type": "<Device Type>",
"node_id": "<Node ID>" (可选),
}
}

响应(成功):
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_next_schedule_ack",
"state": <Schedule>,
"responseCode": 0
}
}

#### 6. 获取日程 (`get_schedules`)
检索特定日期的所有日程。

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_schedules",
"fields": {
"date": "<Date String of Format dd/mm/yyyy>"
}
}

响应(成功):
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_schedules_ack",
"state": {
"schedules": [<Schedule>, ...]
},
"responseCode": 0
}
}

#### 7. 获取未来日程 (`get_future_schedules`)
检索所有未来的日程。

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_future_schedules",
"fields": {}
}

响应(成功):
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_future_schedules_ack",
"state": {
"schedules": [<Schedule>, ...]
},
"responseCode": 0
}
}

#### 8. 移除日程 (`remove_schedule`)
通过 ID 移除特定日程。

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "remove_schedule",
"fields": {
"id": <Schedule ID>
}
}

响应(成功):
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "remove_schedule_ack",
"state": "日程 <Schedule ID> 已成功移除",
"responseCode": 0
}
}

#### 9. 获取站点反馈 (`get_feedback`)
检索关于系统状态的详细反馈。

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_feedback",
"fields": {
"device": <Device (node) level>
}
}

响应(成功):

[反馈有效负载结构](/External%20Signals/MQTT/eniris-mqtt/#mqtt-feedback-payload-structure/)

#### 10. 站点拓扑 (`get_toplogy`)
获取站点的拓扑结构。

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_topology",
"fields": {}
}

响应(成功):
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_topology_ack",
"state": {
"nodeId": <nodeId>,
"nodeType": <nodeType>,
"nomCurrent": <nominalCurrent>,
"children": [{<ChildObject>}]
},
"responseCode": 0
}
}

#### 标准日程响应格式

{
"id": <Schedule ID>,
"device_type": "<Device Type>",
"node_id": "<Node ID>" (可选),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Schedule Policy>",
"power_setpoint_w": <Setpoint in watts>,
"created_at": <Unix Timestamp>
}

### 组件类型和政策
有关可调度的组件和政策的详细信息,请参阅实时 MQTT 控制文档中的 [MQTT 组件和政策](/External%20Signals/MQTT/eniris-mqtt/#components-and-policies) 部分。

设备特定的日程可以使用可选的 `node_id` 字段发送,引用可控制设备的节点 ID。

### 错误处理
所有消息在发生错误时可以返回错误响应,`responseCode: 1`:

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "<Message Type>_ack",
"error": <Error Body>,
"responseCode": 1
}
}

当发生不相关的错误时,消息类型将为(`general_error`)。

常见错误包括:
- 与现有日程重叠
- 无效的时间范围
- 找不到设备类型
- 找不到日程 ID
- 对于设备类型的无效政策

### 日程管理规则
1. 重叠规则
- 日程不能重叠相同的设备类型
- 日程不能重叠相同的设备
- 相同设备和设备类型的日程不能重叠
- 如果在创建新日程时将 `remove_overlap` 变量设置为 `True`,则将删除现有的重叠日程。
2. 每个日程必须包含:
- 有效的设备类型
- 开始时间(Unix 时间戳)
- 结束时间(Unix 时间戳)
- 政策(与设备类型可用政策匹配)
- 功率设定点(对于需要的政策)
3. 开始时间必须在结束时间之前
4. 如果开始时间在过去,则自动更改为立即开始
5. 只有尚未开始的日程可以删除。**活动日程不能被删除。**
6. 可以独立为不同的设备类型设置日程
7. 当日程变为活动时,系统会自动应用适当的政策